package main

import (
	"fmt"
)

const (
	MaxRow = 10
	MaxCol = 10
)

// main
//
//	@Description: 递归-迷宫
//
// .	元素：1 就是墙
// . 元素：0，代表没有走过的点
// .	元素：2 则代表通路
// . 元素：3 则代表已经走过的路,但是走不通
func main() {

	var mazeMap *[][]int = GenerateMazeMap(MaxRow, MaxCol)
	//设置障碍
	(*mazeMap)[3][1] = 1
	(*mazeMap)[3][2] = 1
	(*mazeMap)[6][3] = 1
	PrintMazeMap(mazeMap)
	FindWayOut00(mazeMap, 1, 1)
	fmt.Println()
	PrintMazeMap(mazeMap)
}

// FindWayOut00
//
//	@Description: 下右上左(推荐策略)
//	@param mazeMap
//	@param i
//	@param j
//	@return bool
func FindWayOut00(mazeMap *[][]int, i int, j int) bool {
	if (*mazeMap)[MaxCol-2][MaxCol-2] == 2 { // 通路
		return true
	}
	if (*mazeMap)[i][j] == 0 { //可以探测
		(*mazeMap)[i][j] = 2
		if FindWayOut00(mazeMap, i+1, j) { //向下
			return true
		} else if FindWayOut00(mazeMap, i, j+1) { //向右
			return true
		} else if FindWayOut00(mazeMap, i-1, j) { //向上
			return true
		} else if FindWayOut00(mazeMap, i-1, j) { //向左
			return true
		} else {
			(*mazeMap)[i][j] = 3 //死路
			return false
		}
	} else {
		return false
	}

}

// FindWayOut
//
//	@Description: 上下左右
//	@param mazeMap
//	@param i
//	@param j
//	@return bool
func FindWayOut(mazeMap *[][]int, i int, j int) bool {
	if (*mazeMap)[MaxCol-2][MaxCol-2] == 2 { // 通路
		return true
	}
	if (*mazeMap)[i][j] == 0 { //可以探测
		(*mazeMap)[i][j] = 2
		if FindWayOut(mazeMap, i-1, j) { //向上走
			return true
		} else if FindWayOut(mazeMap, i+1, j) { //向下走
			return true
		} else if FindWayOut(mazeMap, i, j-1) { //向左走
			return true
		} else if FindWayOut(mazeMap, i, j+1) { //向右走
			return true
		} else {
			(*mazeMap)[i][j] = 3 //死路
			return false
		}
	} else {
		return false
	}

}

// GenerateMazeMap
//
//	@Description: 构建迷宫地图
//	@param row
//	@param col
func GenerateMazeMap(row int, col int) *[][]int {
	//.	元素：1 就是墙
	//. 元素：0，代表没有走过的点
	//.	元素：2 则代表通路
	//. 元素：3 则代表已经走过的路,但是走不通
	var mazeMap [][]int = make([][]int, row)
	for i := 0; i < row; i++ {
		mazeMap[i] = make([]int, col)
	}

	//设置上下两横墙
	for i := 0; i < col; i++ {
		mazeMap[0][i] = 1
		mazeMap[row-1][i] = 1
	}
	//设置左右两竖墙
	for i := 0; i < row-1; i++ {
		mazeMap[i][0] = 1
		mazeMap[i][col-1] = 1
	}

	return &mazeMap
}

// PrintMazeMap
//
//	@Description: 打印迷宫地图
//	@param mazeMap
func PrintMazeMap(mazeMap *[][]int) {
	for i := 0; i < len(*mazeMap); i++ {
		for j := 0; j < len((*mazeMap)[i]); j++ {
			fmt.Printf("%d ", (*mazeMap)[i][j])
		}
		fmt.Println()
	}
}
